// Copyright (C) 2023 即时通讯网(52im.net) & Jack Jiang.
// The RainbowChat Project. All rights reserved.
// 
// 【本产品为著作权产品，合法授权后请放心使用，禁止外传！】
// 【本次授权给：<北京小羊驼科技有限公司>，授权编号：<NT231212144350>，代码指纹：<A.702363430.550>，技术对接人微信：<ID: wxid_wbyootvkdcgj22>】
// 【授权寄送：<收件：苏先生、地址：北京市大兴区北京密码西区6号楼1单元301、电话：18613885610、邮箱：bd@huiyuanxiang-inc.com>】
// 
// 【本系列产品在国家版权局的著作权登记信息如下】：
// 1）国家版权局登记名(简称)和权证号：RainbowChat    （证书号：软著登字第1220494号、登记号：2016SR041877）
// 2）国家版权局登记名(简称)和权证号：RainbowChat-Web（证书号：软著登字第3743440号、登记号：2019SR0322683）
// 3）国家版权局登记名(简称)和权证号：RainbowAV      （证书号：软著登字第2262004号、登记号：2017SR676720）
// 4）国家版权局登记名(简称)和权证号：MobileIMSDK-Web（证书号：软著登字第2262073号、登记号：2017SR676789）
// 5）国家版权局登记名(简称)和权证号：MobileIMSDK    （证书号：软著登字第1220581号、登记号：2016SR041964）
// * 著作权所有人：江顺/苏州网际时代信息科技有限公司
// 
// 【违法或违规使用投诉和举报方式】：
// 联系邮件：jack.jiang@52im.net
// 联系微信：hellojackjiang
// 联系QQ号：413980957
// 授权说明：http://www.52im.net/thread-1115-1-1.html
// 官方社区：http://www.52im.net
package com.x52im.rbchat.logic.qrcode;

import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.provider.MediaStore;
import android.util.Log;
import android.view.Gravity;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;

import com.eva.android.AppManager;
import com.eva.android.PictureHelper;
import com.eva.android.widget.ChoiceItemPopWindow;
import com.eva.android.widget.DataLoadingAsyncTask2;
import com.eva.android.widget.WidgetUtils;
import com.eva.epc.common.util.CommonUtils;
import com.king.zxing.CameraScan;
import com.king.zxing.CaptureActivity;
import com.king.zxing.DecodeConfig;
import com.king.zxing.DecodeFormatManager;
import com.king.zxing.analyze.MultiFormatAnalyzer;
import com.king.zxing.util.CodeUtils;
import com.x52im.rbchat.R;
import com.x52im.rbchat.logic.qrcode.utils.QRCodeScheme;
import com.x52im.rbchat.logic.qrcode.utils.StatusBarUtils;
import com.x52im.rbchat.logic.sns_group.JoinGroupActivity;
import com.x52im.rbchat.network.http.async.QueryFriendInfo;
import com.x52im.rbchat.permission2.PermissionManager;
import com.x52im.rbchat.utils.ActivityRequestCode;
import com.x52im.rbchat.utils.IntentFactory;

import java.io.IOException;

import androidx.annotation.Nullable;
import androidx.core.app.ActivityCompat;

/**
 * 2维码扫描界面实现类。
 *
 * @author JackJiang
 * @since 8.0
 */
public class QRCodeScanActivity extends CaptureActivity {

    private final static String TAG = QRCodeScanActivity.class.getSimpleName();

    /** 标题栏上的"更多"按钮 */
    private ImageView ivMore = null;
    /** 标题栏上的"更多"按钮对应的弹出菜单 */
    private MorePopWindow menuWindow = null;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 添加到RainbowChat的Activity管理器栈中（以便页面退出时即时释放）
        AppManager.getAppManager().addActivity(this);
        // 初始化ui相关
        initViews();
    }

    private void initViews(){
        // 全面屏标题栏设置
        StatusBarUtils.immersiveStatusBar(this, findViewById(R.id.toolbar),0.2f);
        TextView tvTitle = findViewById(R.id.tvTitle);
        tvTitle.setText(R.string.qrcode_scan_activity_title);

        ivMore = findViewById(R.id.ivRight);
        ivMore.setVisibility(View.VISIBLE);
        // 标题栏"更多"按钮的事件监听（点击显示弹出菜单）
        ivMore.setOnClickListener(v -> showMenuWindow());
    }

    /**
     * 显示弹出菜单。
     */
    public void showMenuWindow() {
        //为弹出窗口实现监听类
        final View.OnClickListener itemsOnClick = v -> {
            menuWindow.dismiss();
            // 从相册中选择
            if (v.getId() == R.id.qrcode_scan_activity_popmenu_dialog_btn_selectFromPhoto) {
                onFromPhoto(null);
            }
        };

        // 实例化SelectPicPopupWindow
        menuWindow = new MorePopWindow(this, itemsOnClick);
        // 显示窗口
        menuWindow.showAtLocation(findViewById(R.id.qrcode_scan_activity_MainLL), Gravity.BOTTOM | Gravity.CENTER_HORIZONTAL, 0, 0); //设置layout在PopupWindow中显示的位置
    }

    @Override
    protected void onDestroy() {
        // 结束Activity&从RainbowChat的Activity管理器栈中移除（以便页面退出时即时释放）
        AppManager.getAppManager().removeActivity(this);
        super.onDestroy();
    }

    @Override
    public int getLayoutId() {
        return R.layout.qrcode_scan_activity;
    }

    @Override
    public void initCameraScan() {
        super.initCameraScan();

        //初始化解码配置
        DecodeConfig decodeConfig = new DecodeConfig();
        decodeConfig.setHints(DecodeFormatManager.QR_CODE_HINTS)//如果只有识别二维码的需求，这样设置效率会更高，不设置默认为DecodeFormatManager.DEFAULT_HINTS
                .setFullAreaScan(true)//设置是否全区域识别，默认false
                .setAreaRectRatio(0.8f)//设置识别区域比例，默认0.8，设置的比例最终会在预览区域裁剪基于此比例的一个矩形进行扫码识别
                .setAreaRectVerticalOffset(0)//设置识别区域垂直方向偏移量，默认为0，为0表示居中，可以为负数
                .setAreaRectHorizontalOffset(0);//设置识别区域水平方向偏移量，默认为0，为0表示居中，可以为负数

        //在启动预览之前，设置分析器，只识别二维码
        getCameraScan()
                .setVibrate(true)//设置是否震动，默认为false
                .setPlayBeep(true)//设置是否发声，默认为false
                .setNeedAutoZoom(true)//二维码太小时可自动缩放，默认为false
                .setAnalyzer(new MultiFormatAnalyzer(decodeConfig));//设置分析器,如果内置实现的一些分析器不满足您的需求，你也可以自定义去实现
    }

    // 标题栏上的返回按钮事件处理
    public void onBackClick(View v){
        finish();
    }

    // 我的2维码按钮事件处理
    public void onShowMyCard(View v){
        // 进入"我的二维码"界面
        Intent i = IntentFactory.createQRCodeGenerateMyIntent(this);
        if(i != null)
            startActivity(i);
    }

    // 相册按钮事件处理
    public void onFromPhoto(View v){
        PictureHelper.choosePhoto3(this, ActivityRequestCode.REQUEST_CODE_FOR_CHOOSE_PHOTO);
    }

    /**
     * 从图片中解析2维码内容。
     *
     * @param bitmap 图片
     */
    private void parseQRCodeFromPhoto(Bitmap bitmap) {
        if (bitmap == null) {
            Log.w(TAG, "无效的参数：bitmap=null!");
            return;
        }

        // 异步解析
        new DataLoadingAsyncTask2<Object, Integer, String>(this, getString(R.string.qrcode_scan_activity_scaning)) {
            @Override
            protected String doInBackground(Object[] objects) {
                // 先尝试解析，看看是否能识别2维码
                return CodeUtils.parseQRCode(bitmap);
            }

            @Override
            protected void onPostExecuteImpl(Object o) {
                String result = (String) o;
                // 不能识别就给提示信息，并保持当前界面不退出
                if (result == null) {
                    Log.w(TAG, "二维码识别失败，识别从相册中选择的图片后result=null!");
                    WidgetUtils.showWithDialog(QRCodeScanActivity.this, getString(R.string.general_error), getString(R.string.qrcode_scan_activity_distinguish_fail));
                    return;
                }

                // 识别成功就返回打开本扫描界面的Activity，并将本次扫描结果返回（由该Activity继续完成2维码识别完成后的处理）
                Intent intent = new Intent();
                intent.putExtra(CameraScan.SCAN_RESULT, result);
                setResult(Activity.RESULT_OK, intent);
                finish();
            }
        }.execute();
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if(resultCode == RESULT_OK && data!=null){
            // 从相册中选取含2维码的图片回来的
            if (requestCode == ActivityRequestCode.REQUEST_CODE_FOR_CHOOSE_PHOTO) {
                try {
                    Bitmap bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), data.getData());
                    if (bitmap == null) {
                        Log.w(TAG, "二维码识别失败，从相册中选择的图片bitmap=null!");
                        WidgetUtils.showWithDialog(QRCodeScanActivity.this, getString(R.string.general_error), getString(R.string.qrcode_scan_activity_distinguish_fail));
                        return;
                    }

                    // 解析图片内容
                    parseQRCodeFromPhoto(bitmap);
                } catch (IOException e) {
                    Log.w(TAG, e);
                }
            }
        }
    }

    /**
     * 进入本2维码扫描界面的统一工具方法。
     *
     * @param parentActivity 打开本界面的activity类
     */
    public static void gotoQrCodeScan(Activity parentActivity){
        // 开始动态相机权限申请（用于targetSDKVersion>=23，即Android6.0及以上系统时）
        PermissionManager.requestPermission_CARMERA(parentActivity
                // 权限获取成功或已经取得此权限时
                , (o, arg) -> {
                    //** 权限正常获取，走正常的代码逻辑
                    try {
                        ActivityCompat.startActivityForResult(parentActivity, IntentFactory.createQRCodeScanIntent(parentActivity), ActivityRequestCode.REQUEST_CODE_FOR_QRCODE_SCAN, null);
                    } catch (Exception e) {
                        Log.w(TAG, e);
                        try {
                            WidgetUtils.showWithDialog(parentActivity, parentActivity.getString(R.string.general_error), parentActivity.getString(R.string.qrcode_scan_activity_not_surpport_camera));
                        } catch (Exception ee) {
                            Log.w(TAG, ee);
                        }
                    }
                }
                , null);
    }

    /**
     * 解析2维码扫码结果并进入相应和业务逻辑处理（主要用于从2维码扫描界面扫描完成后的回调结果处理）。
     *
     * @param originalQrcodeStr 扫描出的原始2维码字符串，形如"52im_rainbowchat://add_user/400069"
     */
    public static void processQRCodeScanResult(Activity activity, String originalQrcodeStr) {
        if (originalQrcodeStr != null) {
            try {
                QRCodeScheme.QRCodeData qrData = QRCodeScheme.parseCodeData(originalQrcodeStr);
                // 2维码内容前缀（形如“52im_rainbowchat://add_user/”）
                String scheme = qrData.getScheme();
                // 2维码内容（形如“400069”）
                String value = qrData.getValue();
                if (!CommonUtils.isStringEmpty(scheme, true) && !CommonUtils.isStringEmpty(value, true)) {
                    switch (scheme) {
                        case QRCodeScheme.QR_CODE_SCHEME_ADD_USER:
                            QueryFriendInfo.gotoWatchUserInfo(activity, value, null);
                            break;
                        case QRCodeScheme.QR_CODE_PSCHEME_JOIN_GROUP:
                            activity.startActivity(IntentFactory.createJoinGroupIntent(activity, value, JoinGroupActivity.JOIN_BY_SCAN_QRCODE));
                            break;
                        default:
                            WidgetUtils.showToastLong(activity, activity.getString(R.string.qrcode_scan_activity_not_surpport_qrcontent), WidgetUtils.ToastType.INFO);
                            break;
                    }
                } else {
                    WidgetUtils.showToastLong(activity, activity.getString(R.string.qrcode_scan_activity_not_invalid_qrcode), WidgetUtils.ToastType.INFO);
                }
            } catch (Exception e) {
                Log.w(TAG, e);
            }
        } else {
            WidgetUtils.showToastLong(activity, activity.getString(R.string.qrcode_scan_activity_not_invalid_qrcode), WidgetUtils.ToastType.INFO);
        }
    }


    /**
     * 标题栏"更多"按钮对应的弹出窗口式菜单实现类。
     */
    private class MorePopWindow extends ChoiceItemPopWindow {
        private Button btnSelectFromPhoto, btnCancel;

        public MorePopWindow(Activity context, View.OnClickListener mItemsOnClick) {
            super(context, mItemsOnClick
                    , R.layout.qrcode_scan_activity_popmenu_dialog
                    , R.id.qrcode_scan_activity_popmenu_dialog_pop_layout);
        }

        protected void initContentViewComponents(View mMenuView) {
            btnSelectFromPhoto = mMenuView.findViewById(R.id.qrcode_scan_activity_popmenu_dialog_btn_selectFromPhoto);
            btnCancel = mMenuView.findViewById(R.id.qrcode_scan_activity_popmenu_dialog_btn_cancel);
            // 取消按钮
            btnCancel.setOnClickListener(createCancelClickListener());
            // 设置按钮监听
            btnSelectFromPhoto.setOnClickListener(mItemsOnClick);
        }
    }
}